package cn.ekgc.system.service.impl;

import cn.ekgc.system.dao.MenuDao;
import cn.ekgc.system.pojo.dto.MenuDTO;
import cn.ekgc.system.pojo.vo.MenuTree;
import cn.ekgc.system.service.MenuService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@Service("MenuService")
public class MenuServiceImpl implements MenuService {

    @Resource
    @Autowired
    MenuDao md;

    @Override
    public List<MenuTree> getMenuTreeByUserId(Long userId) {
        List<MenuDTO> menuDTOS = md.findMenusByUserId(userId);
        // 过滤出目录数据
        List<MenuDTO> muLu = menuDTOS.stream()
                //过滤条件
                .filter(md -> md.getMenuType() == 1)
                .toList();
        return buildTrees(muLu,menuDTOS);
    }

    @Override
    public List<MenuTree> getMenuTreeByRoleId(Long roleId) {
        return null;
    }

    /**
     * 构建菜单树
     * @param data 需要处理的数据
     * @param menus 数据源
     * @return 菜单树
     */
    private List<MenuTree> buildTrees(List<MenuDTO> data, List<MenuDTO> menus) {
        List<MenuTree> menuTrees = new ArrayList<>();
        // 封装目录数据 将data集合转成树
        data.forEach(md -> {
            // 先找出所有的目录数据，封装成MenuTree对象
            MenuTree ml = new MenuTree();
            // 一个对象的数据copy给另一个对象
            // 根据属性名将数据复制给另外一个对象，而不需要相同类型
            BeanUtils.copyProperties(md, ml);
            List<MenuDTO> childs = menus.stream()
                    .filter(m -> m.getParentId().equals(md.getId()))
                    .toList();
            //没有子菜单 不继续执行递归
            // 封装子菜单
            // 找出当前目录的子菜单
            if (!childs.isEmpty()){
                ml.setChildren(buildTrees(childs,menus));
            }
            menuTrees.add(ml);
        });
        return menuTrees;
    }
}